#!/bin/bash

# 配置参数
REPO_URL="https://gitee.com/Loadstar_QYZ/warehouse-management.git"  # Git仓库地址
BRANCH="develop-backend"                                             # 目标分支
CODE_DIR="/root/warehouse/backend"                                  # 本地代码目录
JAR_NAME="WarehouseManagement-0.0.1-SNAPSHOT.jar"                   # 编译生成的JAR文件名
APP_DIR="/root/warehouse/springApp"                                   # 应用输出目录
LOG_FILE="/root/warehouse/deploy.log"                            # 日志文件路径

# 日志函数
log() {
    echo "$(date +'%Y-%m-%d %H:%M:%S') - $1" >> "$LOG_FILE"
}

# 错误处理
error_exit() {
    log "ERROR: $1"
    exit 1
}

# 初始化代码目录
init_code_dir() {
    if [ ! -d "$CODE_DIR" ]; then
        log "代码目录不存在，开始克隆仓库..."
        git clone -b "$BRANCH" "$REPO_URL" "$CODE_DIR" || error_exit "克隆仓库失败"
        log "克隆完成"
    fi
}

# 检查更新
check_update() {
    cd "$CODE_DIR" || error_exit "进入代码目录失败"
    LOCAL=$(git rev-parse "$BRANCH")
    git fetch origin "$BRANCH" || error_exit "获取远程仓库信息失败"    
    REMOTE=$(git rev-parse "origin/$BRANCH")

    if [ "$LOCAL" != "$REMOTE" ]; then
        log "检测到仓库更新，开始拉取代码..."
        git pull origin "$BRANCH" || error_exit "拉取代码失败"
        log "代码更新完成"
        return 0
    else
        log "仓库无更新"
        return 1
    fi
}

# 编译打包
build_app() {
    log "开始编译打包..."
    # 定义宿主机上的Maven仓库目录
    MAVEN_REPO_DIR="/root/maven/repo"
    # 创建仓库目录
    mkdir -p "$MAVEN_REPO_DIR" || error_exit "创建Maven仓库目录失败"

    docker run --rm \
        -v "$CODE_DIR":/app \
        -v "$MAVEN_REPO_DIR":/usr/local/maven/repo \  
        -w /app \
        docker.xuanyuan.me/maven:3.9-eclipse-temurin-21-alpine \
        mvn -Dmaven.repo.local=/usr/local/maven/repo clean package -DskipTests || error_exit "Maven编译失败"

    log "编译完成，生成JAR文件: $JAR_NAME"

    # 将编译好的JAR文件复制到指定目录
    cp "$CODE_DIR/target/$JAR_NAME" "$APP_DIR/$JAR_NAME" || error_exit "复制JAR文件失败"
}

# 运行应用（通过 docker-compose）
run_app() {
    log "开始运行应用..."
    # 使用 docker-compose 启动应用服务
    docker compose -f docker-compose.yml up -d || error_exit "启动容器失败"

    log "应用已通过 docker-compose 启动"
}

# 主流程
main() {
    log "部署流程开始"
    init_code_dir
    if check_update || [ ! -f "$APP_DIR/$JAR_NAME" ]; then
        build_app
    else
        log "无需部署"
    fi
    log "部署流程结束"
    run_app

}

# 执行主流程
main